package com.imaker.utils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.OutputStreamWriter;

/**
 * 该类封装了对文件的相关操作等内容
 * @author mayonghua
 *
 */
public class FileHelper {

//	设置缓冲区的大小
	public static int BUFFERE_SIZE = 1024;
	
	/**
	 * 根据传入的源文件完整路径，和目的文件完整路径，完成文件的复制工作
	 * @param source
	 * @param dest
	 * @throws Exception
	 */
	public static void copy(String source,String dest) throws Exception{
		File sourceFile = new File(source);
//		如果源文件不存在，则直接返回
		if(!sourceFile.exists()){
			return;
		}
		File destFile = new File(dest);
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceFile),BUFFERE_SIZE);
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile),BUFFERE_SIZE);
		byte buffer[] = new byte[BUFFERE_SIZE];
		int len = 0;
		while((len=bis.read(buffer))>0){
			bos.write(buffer,0,len);
		}
		bos.close();
		bis.close();
	}
	
	/**
	 * 把指定的内容写入指定的文件,type是指是覆盖文件，还是追加写入
	 * @param source 要写入的文件绝对地址（完整路径）
	 * @param content 要写入的文件内容
	 * @param type 是覆盖还是追加
	 * @throws Exception
	 */
	public static void writeToFile(String source,String content,boolean type) throws Exception {
		File sourceFile = new File(source);
//		如果文件不存在，就创建一个
		if(!sourceFile.exists()){
			sourceFile.createNewFile();
		}
//		如果为true，说明是往文件里面追加内容
		FileWriter fw = new FileWriter(sourceFile,type);
		fw.write(content);
		fw.close();
	}
	
	/**
	 * 从指定的文件中读取内容
	 * @param source
	 * @return
	 * @throws Exception
	 */
	public static String readFromFile(String source) throws Exception{
		StringBuffer sb = new StringBuffer();
		File sourceFile = new File(source);
		String tempStr;
//		构建bufferedReader,它可以每次读一行
		BufferedReader fr = new BufferedReader(new FileReader(sourceFile));
		while((tempStr=fr.readLine())!=null){
			sb.append(tempStr);
		}
		return sb.toString();
	}
	
	
	/**
	 * 使用该方法时，如果有相同的文件，就会重命名该文件，比如a.java,a(1).java
	 * @param file
	 */
	public static String isExists(File file){
		int i=1;
		String returnName = "";
		if(file.exists()){
			String fileName = file.getName();
			String suff = StringHelper.getSuffName(fileName,true);
			String prefixName = StringHelper.getPrefixName(fileName);
			File tempFile = new File(prefixName+"("+i+")"+suff);
			isExists(tempFile);
			i++;
		}else {
			returnName = file.getName();
		}
		return returnName;
	}
	
	/**
	 * 按照指定的目录结构创建文件夹
	 * @param dir
	 * @throws Exception
	 */
	public static void mkdir(String dir) throws Exception{
		File dirFile = new File(dir);
		if(!dirFile.isDirectory()){
			dirFile.mkdirs();
		}
	}
	
	/**
	 * 根据指定的编码格式写入文件
	 * @param source
	 * @param content
	 * @param charset 编码格式名称：utf-8，gbk
	 * @throws Exception
	 */
	public static void writeToFile(String source,String content,String charset) throws Exception {
		File file = new File(source);
		if(!file.exists()){
			file.createNewFile();
		}
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file),charset);
		osw.write(content);
		osw.close();
	}
}
